<?php

// +----------------------------------------------------------------------
// | 全局中间件
// +----------------------------------------------------------------------
// | 用于初始化数据
// +----------------------------------------------------------------------

declare(strict_types=1);

namespace app\middleware;

use liang\MicroEngine;
use think\facade\Cache;

class Initialize
{
    // 初始化版本 建议同模块版本
    // 每一个版本号自动初始化一次
    private $version = '1.0.0';

    /**
     * 处理请求
     *
     * @param \think\Request $request
     * @param \Closure       $next
     * @return Response
     */
    public function handle($request, \Closure $next)
    {
        if (MicroEngine::isMicroEngine()) {
            // 微擎版 兼容微擎多开
            $name = 'version_uniacid_' . MicroEngine::getUniacid();
        } else {
            // 独立版
            $name = 'version';
        }
        if (Cache::store('file')->get($name) != $this->version) {
            // 初始化配置入口
            $this->run();
            // 本次版本初始化纪录存入缓存
            Cache::store('file')->set($name, $this->version);
        }
        return $next($request);
    }

    /**
     * 初始化入口
     */
    private function run()
    {
        // 系统配置
        call_user_func([\app\common\logic\Config::class, 'init'], $this->getInitData('config'));
        // 文件存储
        call_user_func([\app\common\logic\Storage::class, 'init'], $this->getInitData('storage'));
    }

    // +-------------------------------------------------------------
    // | 功能封装
    // +-------------------------------------------------------------

    /**
     * 读取默认配置
     *
     * @param string $name
     */
    private function getInitData(string $name)
    {
        return \think\facade\Config::load('init/' . $name, $name);
    }
}
